package com.ruoyi.charge.model;

import lombok.Builder;
import lombok.Data;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;

import com.ruoyi.common.utils.BcdCodeTransfer;
import cn.hutool.core.util.StrUtil;

/**
 * 运营平台远程控制启机
 *
 * @author laifeng
 * @version 1.0
 * @date 2025/7/29 17:05
 */

@Data
@Builder
public class ManageWebControllerStartPayload {

    /**
     * 交易流水号
     */
    private String tradeSerialNumber;

    /**
     * 桩编号
     */
    private String sn;

    /**
     * 枪号
     */
    private String gunNo;

    /**
     * 逻辑卡号
     */
    private String cardNo;


    /**
     * 物理卡号
     */
    private String physicalCardNo;


    /**
     * 账户余额
     */
    private BigDecimal balance;

    /**
     * 从字节数组解析运营平台远程控制启机消息体
     * @param payload 字节数组
     * @return 解析后的对象
     */
    public static ManageWebControllerStartPayload fromBytes(byte[] payload) {
        ByteBuffer buffer = ByteBuffer.wrap(payload).order(ByteOrder.LITTLE_ENDIAN);
        
        // 1. 交易流水号 BCD 码 16位
        byte[] tradeSerialNumberBytes = new byte[16];
        buffer.get(tradeSerialNumberBytes);
        String tradeSerialNumber = BcdCodeTransfer.bcdToDecimalString(tradeSerialNumberBytes);
        
        // 2. 桩编号 BCD 码 7位 不足7位补0
        byte[] snBytes = new byte[7];
        buffer.get(snBytes);
        String snRaw = BcdCodeTransfer.bcdToDecimalString(snBytes);
        String sn = StrUtil.padPre(snRaw, 14, '0');
        
        // 3. 枪号 BCD 码 1位
        byte[] gunNoBytes = new byte[1];
        buffer.get(gunNoBytes);
        String gunNo = BcdCodeTransfer.bcdToDecimalString(gunNoBytes);
        
        // 4. 逻辑卡号 BCD 码 8位 不足补0
        byte[] cardNoBytes = new byte[8];
        buffer.get(cardNoBytes);
        String cardNoRaw = BcdCodeTransfer.bcdToDecimalString(cardNoBytes);
        String cardNo = StrUtil.padPre(cardNoRaw, 16, '0');
        
        // 5. 物理卡号 BIN 码 8位 不足补0
        byte[] physicalCardNoBytes = new byte[8];
        buffer.get(physicalCardNoBytes);
        String physicalCardNoRaw = BcdCodeTransfer.bcdToDecimalString(physicalCardNoBytes);
        String physicalCardNo = StrUtil.padPre(physicalCardNoRaw, 16, '0');
        
        // 6. 账户余额 BIN 码 4位 保留到小数点两位
        int balanceValue = buffer.getInt();
        BigDecimal balance = new BigDecimal(balanceValue).divide(new BigDecimal("100"), 2, RoundingMode.HALF_UP);
        
        return ManageWebControllerStartPayload.builder()
                .tradeSerialNumber(tradeSerialNumber)
                .sn(sn)
                .gunNo(gunNo)
                .cardNo(cardNo)
                .physicalCardNo(physicalCardNo)
                .balance(balance)
                .build();
    }
    

}